package unq.uis.robots.model;

import java.io.Serializable;
import java.util.Random;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

@Observable
public class Pelea implements Serializable{

	private static final long serialVersionUID = 1L;
	public static final String RESULTADO= "resultado";
	public static final String GANANCIA = "ganancia";
	public static final String PORCENTAJEDESGASTE = "procentajeDesgaste";
	private Robot miRobot;
	private Robot contrincante;
	private Jugador jugador;
	private int ganancia;
	private boolean resultado;
	private int porcentajeDesgaste;
	
	public Pelea() {}
	
	public Pelea(Robot miRobot, Robot contrincante, Jugador jugador){
		this.miRobot = miRobot;
		this.contrincante = contrincante;
		this.jugador = jugador;
	}
	
	public void pelear(int apuesta){
		
		if (this.validarPelea(apuesta)){
			
		boolean resultado = this.calcularResultado(); 
		this.setResultado(resultado);
		if (resultado){
			int ganancia = this.calcularGanancia(apuesta);
			this.setGanancia(ganancia);
			this.pagarGanancia(ganancia);
		}else{
			this.getJugador().disminuirDinero(apuesta);
			this.setGanancia(0);
		}
		
		int porcentajeDesgaste = (int) this.calcularPorcentajeDesgaste();
		this.setPorcentajeDesgaste(porcentajeDesgaste);
		this.actualizarDanioDelRobot(porcentajeDesgaste);
		}
	}
	
	
	
	private boolean validarPelea(int apuesta) {
		return this.apuestaValida(apuesta) && this.robotAptoParaPelear();
	}

	private boolean robotAptoParaPelear() {
		if (this.miRobot.getDanio() >= 100){
			throw new UserException("Su robot está completamente dañado, elija otro robot!");
		}else{
			return true;
		}
	}

	private boolean apuestaValida(int apuesta) {
		if (this.getJugador().getDinero() < apuesta){
			throw new UserException("Su apuesta debe ser inferior a su dinero disponible!");
		}else{
			return true;
		}
	}

	public boolean calcularResultado(){
		double magicNumber = this.getMiRobot().getPoderTotal() / (this.getMiRobot().getPoderTotal() + this.getContrincante().getPoderTotal());
		boolean gano = new Random().nextInt(2) <= magicNumber;
		this.setResultado(gano);
		return gano;
	}

	public int calcularGanancia(int apuesta){
		return apuesta * (this.getMiRobot().getPoderTotal() + this.getContrincante().getPoderTotal()) / this.getMiRobot().getPoderTotal();
	}
	
	public void pagarGanancia(int ganancia){
		this.getJugador().setDinero(this.getJugador().getDinero() + ganancia);
	}
	
	public double calcularPorcentajeDesgaste(){
		return new Random().nextInt(21) * this.getContrincante().getPoderTotal() / (this.getMiRobot().getPoderTotal() + this.getContrincante().getPoderTotal());

	}
	
	public int getPorcentajeDesgaste(){
		return porcentajeDesgaste;
	}
	
	public void actualizarDanioDelRobot(int desgaste){
		this.getMiRobot().setDanio(this.getMiRobot().getDanio() + desgaste);
	}
	
	public Robot getMiRobot() {
		return miRobot;
	}

	public void setMiRobot(Robot miRobot) {
		this.miRobot = miRobot;
	}

	public Robot getContrincante() {
		return contrincante;
	}

	public void setContrincante(Robot contrincante) {
		this.contrincante = contrincante;
	}

	public Jugador getJugador() {
		return jugador;
	}

	public void setJugador(Jugador jugador) {
		this.jugador = jugador;
	}

	public int getGanancia() {
		return ganancia;
	}

	public void setGanancia(int ganancia) {
		this.ganancia = ganancia;
	}

	public void setResultado(boolean resultado) {
		this.resultado = resultado;
	}
	
	public boolean getResultado(){
		return this.resultado;
	}

	public void setPorcentajeDesgaste(int porcentajeDesgaste) {
		this.porcentajeDesgaste = porcentajeDesgaste;
	}
	
}
